"""
常量配置模块
定义系统中使用的所有常量，包括环境配置、数据配置等
"""

import os
from pathlib import Path
from dotenv import load_dotenv

# 加载.env文件
load_dotenv()

class Config:
    """系统配置类"""
    
    # 环境配置
    MAX_QUESTIONS = int(os.getenv("MAX_QUESTIONS_PER_REQUEST", 50))
    DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "qwen-turbo")
    EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL")
    TEMP_DIR = os.getenv("TEMP_DIR", "./tmp")
    EXPORT_DIR = os.getenv("EXPORT_DIR", "./exports")
    DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")
    
    # 阿里百炼配置
    ALIBABA_CLOUD_ACCESS_KEY_ID = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
    ALIBABA_CLOUD_ACCESS_KEY_SECRET = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    WORKSPACE_ID = os.getenv("WORKSPACE_ID")
    BAILIAN_KNOWLEDGE_BASE_ID = os.getenv("BAILIAN_KNOWLEDGE_BASE_ID")
    
    # CORS配置
    CORS_ORIGINS = os.getenv("CORS_ORIGINS", "*")
    
    # 确保目录存在
    @classmethod
    def ensure_directories(cls):
        """确保必要的目录存在"""
        Path(cls.TEMP_DIR).mkdir(exist_ok=True)
        Path(cls.EXPORT_DIR).mkdir(exist_ok=True)


class ExamConstants:
    """试卷相关常量"""
    
    # 支持的年级
    GRADES = [
        "小学一年级", "小学二年级", "小学三年级", "小学四年级", "小学五年级", "小学六年级",
        "初一", "初二", "初三",
        "高一", "高二", "高三"
    ]
    
    # 支持的难度
    DIFFICULTIES = ["简单", "中等", "困难"]
    
    # 支持的科目
    SUBJECTS = ["数学", "语文", "英语", "物理", "化学", "生物", "历史", "地理"]
    
    # 支持的题型
    QUESTION_TYPES = ["选择题", "填空题", "判断题", "问答题", "计算题", "应用题", "解答题"]
    
    # 知识点配置
    KNOWLEDGE_POINTS = {
        "数学": {
            "小学": ["加法运算", "减法运算", "乘法运算", "除法运算", "分数", "小数", "几何图形", "单位换算"],
            "初中": ["有理数", "一元一次方程", "一元二次方程", "函数与图像", "三角形", "平行四边形", "圆", "概率初步"],
            "高中": ["函数与导数", "三角函数", "数列", "不等式", "概率统计", "立体几何", "解析几何", "复数"]
        },
        "语文": {
            "小学": ["拼音", "汉字", "词语", "句子", "课文理解", "作文写作", "古诗背诵"],
            "初中": ["词语运用", "句式变换", "文言文阅读", "现代文阅读", "作文写作", "古诗词鉴赏", "文学常识"],
            "高中": ["语言文字运用", "文学类文本阅读", "实用类文本阅读", "写作", "古代诗文阅读", "文学史", "修辞手法"]
        },
        "英语": {
            "小学": ["字母", "单词", "句型", "对话", "阅读理解", "听力理解"],
            "初中": ["词汇", "语法", "阅读理解", "写作", "听力", "口语交际", "翻译"],
            "高中": ["词汇与语法", "阅读理解", "完形填空", "语法填空", "书面表达", "听力理解", "应用文写作"]
        },
        "物理": {
            "初中": ["力学", "运动学", "热学", "光学", "电学", "声学", "磁学"],
            "高中": ["力学与运动", "电磁学", "热学", "光学", "原子物理", "振动与波", "近代物理"]
        },
        "化学": {
            "初中": ["物质的性质", "物质的变化", "水与溶液", "碳和碳的化合物", "金属", "酸碱盐"],
            "高中": ["原子结构", "化学反应", "电化学", "有机化学", "物质结构", "化学平衡", "化学反应速率"]
        },
        "生物": {
            "初中": ["细胞", "生物体的结构与功能", "生物的生命活动", "生物的遗传和变异", "生物与环境"],
            "高中": ["分子与细胞", "遗传与进化", "稳态与环境", "生物技术与安全", "生物信息学"]
        },
        "历史": {
            "初中": ["中国古代史", "世界古代史", "中国近代史", "世界近代史", "中国现代史", "世界现代史"],
            "高中": ["政治史", "经济史", "文化史", "中外关系史", "世界文明史"]
        },
        "地理": {
            "初中": ["地球和地图", "陆地和海洋", "天气和气候", "世界的发展差异", "中国的疆域"],
            "高中": ["自然地理", "人文地理", "区域地理", "环境与可持续发展", "地理信息技术"]
        }
    }


class PromptTemplates:
    """提示词模板"""
    
    QUESTION_GENERATION_TEMPLATE = """
你是一位专业的小学到高中的出题老师。
用户会给出年级、难度、科目、知识点、题型和题目数量，你需要根据要求生成试题。

⚠️ 输出要求：
- 只能输出 JSON，不要有多余说明文字
- 必须严格遵循下面的数据结构
- 所有题目内容必须使用中文
- 题目内容要符合指定的年级水平和难度
- 知识点要与科目相匹配

数据结构示例：
{{
  "grade": "初一",
  "difficulty": "中等",
  "subject": "数学",
  "questions": [
    {{
      "type": "选择题",
      "knowledge_point": "代数式",
      "question": "下列哪个是代数式？",
      "options": ["2x + 3", "2 + 3 = 5", "x > 0", "方程"],
      "answer": "A",
      "explanation": "代数式是用运算符号把数字或表示数字的字母连接而成的式子，2x + 3符合定义。"
    }},
    {{
      "type": "填空题",
      "knowledge_point": "一元一次方程",
      "question": "方程 2x + 5 = 13 的解是 x = ____。",
      "answer": "4",
      "explanation": "移项得 2x = 13 - 5 = 8，所以 x = 4。"
    }},
    {{
      "type": "解答题",
      "knowledge_point": "一元一次方程",
      "question": "解方程：3(x - 2) = 2x + 1",
      "answer": "x = 7",
      "explanation": "展开得 3x - 6 = 2x + 1，移项合并得 x = 7。"
    }}
  ]
}}

请根据下面的用户需求生成{num_questions}道{question_type}题目：
- 年级：{grade}
- 难度：{difficulty}
- 科目：{subject}
- 知识点范围：{knowledge_points}
- 题型：{question_type}
- 题目数量：{num_questions}

{knowledge_context_section}

注意事项：
1. 题目难度要与年级和指定难度相匹配
2. 题目内容要涵盖指定的知识点范围
3. 选择题必须提供4个选项，答案用A/B/C/D表示
4. 填空题在题目中用____表示空白处
5. 解答题要求步骤清晰，答案详细
6. 每道题都要有详细的解析说明
"""